integer l1;
integer x;
integer earflick;
integer earsdown;
vector rot;
default
{
    on_rez(integer start_param)
    {
        if(l1!=0)
            llListenRemove(l1);
        l1=llListen(1,"",llGetOwner(),"");
        if(earflick==TRUE)
        {
            llSetTimerEvent(2+llFrand(8));
        }
        else
        {
            llSetTimerEvent(0);
        }
    }
 
    state_entry()
    {
        if(l1!=0)
            llListenRemove(l1);
        l1=llListen(1,"",llGetOwner(),"");
    }
 
    listen(integer channel, string name, key id, string msg)
    {
        msg=llToLower(msg);
        if(msg=="ears up"||msg=="earsup")
        {
            llSetLocalRot(<-0.29028, 0.00000, 0.00000, 0.95694>);
            earsdown=FALSE;
        }
        else if(msg=="ears down"||msg=="earsdown")
        {
            llSetLocalRot(<-0.65903, 0.25628, 0.70694, 0.01542>);
            earsdown=TRUE;
        }
        else if(msg=="earflick on"||msg=="eartwitch on")
        {
            earflick=TRUE;
            llSetTimerEvent(2+llFrand(8));
        }
        else if(msg=="earflick off"||msg=="eartwitch off")
        {
            earflick=FALSE;
            llSetTimerEvent(0);
        }
    }
 
    timer()
    {
        if(earsdown==FALSE)
        {
            for(x=0; x < 4; x++)
            {
                rot=llRot2Euler(llGetLocalRot());
                rot.z=rot.z + 0.1;
                rot.x=rot.x - 0.05;
                llSetLocalRot(llEuler2Rot(rot));
                llSleep(0.01);
            }
            for(x=0; x < 4; x++)
            {
                rot=llRot2Euler(llGetLocalRot());
                rot.z=rot.z - 0.1;
                rot.x=rot.x + 0.05;
                llSetLocalRot(llEuler2Rot(rot));
                llSleep(0.01);
            }
        }
        llSetTimerEvent(2+llFrand(8));
    }
}